package cn.hicard.risk.web;


import java.util.Date;
import java.util.Timer;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.log4j.Logger;

import cn.hicard.risk.common.Constant;
import cn.hicard.risk.task.FileMonitorTask;
import cn.hicard.risk.task.JzgSyncRunnable;
import cn.hicard.risk.task.SuccessRateStatisticsTask;
import cn.hicard.util.AppConfig;
import cn.hicard.util.DateHelp;

/**
 * 程序初始化Servlet，用以启动各种功能
 * @author zhangy
 *
 */
public class InitializeSevlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	
	
	// 定时器
	private Timer timer = new Timer();
	// 日志工具
	private static Logger logger = Logger.getLogger(Constant.LOGGER_MAIN);
	// 销毁
	public void destroy() {
		timer.cancel();
		logger.debug("文件监控定时器已随WEB关闭而关闭");
	}

	/**
	 *  用于启动定时器、线程等其它一些需要随WEB一起启动的任务，为了保证调用Spring初始完成，因此使用Servlet控制启动顺序
	 *
	 * @throws ServletException if an error occurs
	 */
	public void init() throws ServletException {
		
		//---------------------------- 初始化文件监控定时器 -------------------------//
		initTimer();	
		
		//--------------------- 启动金掌柜数据处理结果同步线程-----------------------//
		initThread();		
	}
	
	/**
	 * 启动金掌柜数据处理结果同步线程
	 */
	private void initThread(){
		String enabled = AppConfig.get("callorder_sync_enabled");
		if("true".equals(enabled)){
			JzgSyncRunnable target = new JzgSyncRunnable();
			// 启用一个线程
			new Thread(target).start();
			// 如果服务器够NB，可以多开几个线程，效率杠杠的！
			// new Thread(target).start();
			logger.info("金掌柜数据处理结果同步线程已[启动]");
		}else{
			logger.info("金掌柜数据处理结果同步线程已[禁用]");
		}		
	}
	
	/**
	 * 初始化定时器
	 */
	private void initTimer(){
		// 首次启时间	
		String starttime = AppConfig.get("monitor_starttime");
		if("0".equals(starttime)){
			logger.info("传统POS交易文件监控定时器已禁用");
			return;
		}
		// 当前时间
		String currtime = DateHelp.format(new Date(), "HH:mm:ss");
		
		// 时间间隔
		String timespan = AppConfig.get("monitor_timespan");
		
		// 计算任务重复的周期
		long period = timeToMillisecond(timespan);
		
		// 计算任务的初次延迟
		long delay = timeToMillisecond(starttime) - timeToMillisecond(currtime);
		// 不得为负数，如果过了时间则立即启动
		delay = delay<0 ? 0:delay;
		// 指派固定间隔任务
		timer.schedule(new FileMonitorTask(), delay, period);
		logger.info("文件监控定时器已启动，任务再经过[" + showTime(delay) + "]之后将启动，固定速率[" + showTime(period) + "]重复执行一次");
		timer.schedule(new SuccessRateStatisticsTask(), 0, 10 * 60 * 1000);
		logger.info("成功率统计任务定时器启动");
	}
	
	/**
	 * 将时间字符串转换为毫秒
	 * @param time
	 * @return
	 */
	private long timeToMillisecond(String time){
		String[] spans = time.split(":");
		long sum = 0;
		int hour = Integer.valueOf(spans[0]);
		int minute = Integer.valueOf(spans[1]);
		int second = Integer.valueOf(spans[2]);
		sum += hour * 60 * 60 * 1000;
		sum += minute * 60 * 1000;
		sum += second * 1000;
		return sum;
	}
	
	/**
	 * 将毫秒显示为*时*分*秒格式
	 * @param millisecond
	 * @return
	 */
	private String showTime(long millisecond){
		long hour =  millisecond/(60 * 60 * 1000);
		long minute = millisecond/(60 * 1000) - hour * 60;
		long second = millisecond/(1000) - hour * 60 * 60 - minute * 60;
		return hour + "时" + minute + "分" + second + "秒";
	}

}

